package com.songlanyun.modules.account.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.songlanyun.common.drive.RootEntity;
import com.songlanyun.common.exception.RRException;
import com.songlanyun.common.utils.custom.MathUtils;
import com.songlanyun.modules.exception.MemberException;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * 会员的资产表（记录余额，一级分拥所得，二级分拥所得等）
 *
 * @author Mark
 * @email sunlightcs@gmail.com
 * @date 2020-11-03 10:01:15
 */
@Data
@TableName("yxt_user_identity_asset")
public class UserIdentityAssetEntity extends RootEntity<Long, AccountEntity> implements Serializable {
    private static final long serialVersionUID = 1L;

    {
        balance = BigDecimal.ZERO;
        integralAble = BigDecimal.ZERO;
        integralConsume = BigDecimal.ZERO;
        voucher = BigDecimal.ZERO;
        likeNum = 0;
        commentNum = 0;
        forwardNum = 0;
        collectNum = 0;
        commissionAble = BigDecimal.ZERO;
        commissionSettled = BigDecimal.ZERO;
        commissionTakeOut = BigDecimal.ZERO;
        version = 0L;
        loveValue = 0;
        cumulativeLoveValue = 0;
    }

    //兑换券余额
    private BigDecimal voucher;
    /**
     *
     */
    @TableId(type = IdType.INPUT)
    private Long id;
    /**
     * 余额(达币)
     */
    private BigDecimal balance;
    /**
     * 积分（可用积分）
     */
    private BigDecimal integralAble;
    /**
     * 已使用过的总积分
     */
    private BigDecimal integralConsume;
    /**
     * 支付密码
     */
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String payPass;
    /**
     * 支付宝帐户
     */
    private String alipayAccount;
    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    /**
     * 点赞数
     */
    private Integer likeNum;
    /**
     * 评论数
     */
    private Integer commentNum;
    /**
     * 转发的总数量
     */
    private Integer forwardNum;
    /**
     * 收藏的总数量
     */
    private Integer collectNum;
    /**
     * 可提现佣金（贡献值）
     */
    private BigDecimal commissionAble;
    /**
     * 已结算佣金
     */
    private BigDecimal commissionSettled;

    /**
     * 已提现佣金
     */
    private BigDecimal commissionTakeOut;

    /**
     * 支付宝帐户对应的真实姓名
     */
    private String alipayName;
    /**
     * 微信帐户
     */
    private String wxAccount;
    /**
     * 微信帐户真实的名称
     */
    private String wxRealName;

    /**
     * 版本号
     */
    private Long version;

    /**
     * 爱心值
     */
    private Integer loveValue;

    /**
     * 累计爱心值
     */
    private Integer cumulativeLoveValue;

    @Override
    public Long getIdentity() {
        return id;
    }

    /**
     * 增加余额
     *
     * @param money
     * @return
     */
    public UserIdentityAssetEntity incBalance(BigDecimal money) {
        this.setBalance(MathUtils.add(this.getBalance(), money));//增加后的余额
        return this;
    }

    /**
     * 增加兑换券
     *
     * @param money
     * @return
     */
    public UserIdentityAssetEntity incVoucher(BigDecimal money) {
        this.setVoucher(MathUtils.add(this.getVoucher(), money));//增加后的兑换券
        return this;
    }

    /**
     * 减少余额
     *
     * @param money
     * @return
     */
    public UserIdentityAssetEntity decBalance(BigDecimal money) {
        if (this.getBalance().compareTo(money) < 0) {//余额是否充足
            throw new RRException(MemberException.NOT_SUFFICIENT_FUNDS);
        }
        this.setBalance(MathUtils.subtractMulti(this.getBalance(), money));//减少后的余额
        return this;
    }

    /**
     * 减少兑换券
     *
     * @param money
     * @return
     */
    public UserIdentityAssetEntity decVoucher(BigDecimal money) {
        if (this.getVoucher().compareTo(money) < 0) {//兑换券是否充足
            throw new RRException(MemberException.INSUFFICIENT_REDEMPTION_VOUCHERS);
        }
        this.setVoucher(MathUtils.subtractMulti(this.getVoucher(), money));//减少后的兑换券
        return this;
    }

    /**
     * 增加会员分佣所得
     *
     * @param money
     * @return
     */
    public UserIdentityAssetEntity incCommission(BigDecimal money) {
        this.setCommissionAble(MathUtils.add(this.getCommissionAble(), money));//增加后的会员所得
        this.setCommissionSettled(MathUtils.add(this.getCommissionSettled(), money));//增加已结算会员所得
        return this;
    }


    /**
     * 减少会员分佣所得
     *
     * @param money
     * @return
     */
    public UserIdentityAssetEntity decCommission(BigDecimal money) {
        this.setCommissionAble(MathUtils.subtract(this.getCommissionAble(), money));//减少后的会员所得
        this.setCommissionTakeOut(MathUtils.add(this.getCommissionTakeOut(), money));//增加已提现（或已消耗的）会员所得
        return this;
    }


    /**
     * 增加积分
     *
     * @param value
     * @return
     */
    public UserIdentityAssetEntity incIntegral(BigDecimal value) {
        this.setIntegralAble(MathUtils.setScaleDown(this.getIntegralAble().doubleValue()+value.doubleValue(),8));//增加后的积分
        return this;
    }

    /**
     * 减少积分,增加使用过的总积分
     *
     * @param value
     * @return
     */
    public UserIdentityAssetEntity decIntegral(BigDecimal value) {
        if (!this.isEnoughPoint(value)) {//积分是否充足
            throw new RRException(MemberException.LACK_OF_INTEGRAL);
        }

        this.setIntegralAble(MathUtils.setScaleDown(this.getIntegralAble().doubleValue()- value.doubleValue(),8));//减少后的积分
        this.setIntegralConsume(MathUtils.setScaleDown(this.getIntegralConsume().doubleValue()+value.doubleValue(),8));//增加后的积分
        return this;
    }

    /**
     * 积分是否足够
     *
     * @param value
     * @return
     */
    public Boolean isEnoughPoint(BigDecimal value) {
        return this.getIntegralAble().compareTo(value) >= 0;
    }

}
